/*
 Tutorial # 0005 Arduino Academy - Sensor NTC
 http://www.arduteka.com/2011/12/tutorial-arduino-0005-sensor-de-temperatura-ntc/

 Conectamos una NTC a una entrada
 analógica para controlar cinco salidas
 en función de la temperatrura.
 
 Además utilizaremos un ponteciómetro para
 controlar la temperatura a partir de la cual
 se activarán las salidas
 
 Este proyecto es de dominio público.
 */
 
//Añadimos la librería math.h
#include <math.h>
 
//Pines para los LED
int pinLed1 = 8;
int pinLed2 = 9;
int pinLed3 = 10;
int pinLed4 = 11;
int pinLed5 = 12;
 
//Pines para las entradas analógicas
int analogPin1 = 0;
int analogPin2 = 1;
 
//Escala de Avisos
int escala = 2;
 
//Variable para la temperatura de disparo
double tempMin = 0.0;
 
//Datos para las ecuaciones
 
float Vin = 5.0;     // [V]       Tensión alimentación del divisor
float Rfija = 1000;  // [ohm]     Resistencia fija del divisor
float R25 = 2800;    // [ohm]     Valor de NTC a 25ºC
float Beta = 3950.0; // [K]      Parámetro Beta de NTC
float T0 = 293.15;   // [K]       Temperatura de referencia en Kelvin
 
float Vout = 0.0;    // [V]       Variable para almacenar Vout
float Rntc = 0.0;    // [ohm]     Variable para NTC en ohmnios
 
float TempK = 0.0;   // [K]       Temperatura salida en Kelvin
float TempC = 0.0;   // [ºC]      Temperatura salida en Celsius
 
void setup() {
 
  //Comenzamos la comunicación puerto serie
  Serial.begin(9600);
 
  //Declaramos pines de salida
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  pinMode(pinLed3, OUTPUT);
  pinMode(pinLed4, OUTPUT);
  pinMode(pinLed5, OUTPUT);
 
  //Y los pines de entrada
  pinMode(analogPin1, INPUT);
  pinMode(analogPin2, INPUT);
 
}
 
void loop()
{
  //Primero leemos el pootenciómetro
  tempMin = analogRead(analogPin2);
  //Lo mapeamos a valores de -100 a 800
  tempMin = map (tempMin, 0, 1023, -100, 800);
  //Y lo dividimos entre 10 para darle un decimal
  tempMin = tempMin/10;
 
  //Y lanzamos el ajuste establecido via serie
  Serial.println("-----------------------------------------------");
  Serial.println();
  Serial.print("AJUSTE DE TEMPERATURA MINIMA A ");
  Serial.print(tempMin);
  Serial.println(" GRADOS CELSIUS");
  Serial.println();
  Serial.println("-----------------------------------------------");
 
  //Y ahora calculamos la Temperatura
 
  //Primero la Vout del divisor
  Vout=(Vin/1024)*(analogRead(analogPin1));
 
  //Ahora la resistencia de la NTC
  Rntc=(Vout*Rfija)/(Vin-Vout);
 
  //Y por último la temperatura en Kelvin
  TempK = Beta/(log(Rntc/R25)+(Beta/T0));
 
  //Y ahora la pasamos a celsius
  TempC = TempK-273.15;
 
  //Y lo mostramos por puerto serie
  Serial.println();
  Serial.print("LA TEMPERATURA DE LA NTC ES DE ");
  Serial.print(TempC);
  Serial.println(" GRADOS CELSIUS");
  Serial.println();
 
  //Ahora las comparaciones para las salidas
  if(TempC < tempMin)
  {
  digitalWrite(pinLed1, HIGH);
  digitalWrite(pinLed2, LOW);
  digitalWrite(pinLed3, LOW);
  digitalWrite(pinLed4, LOW);
  digitalWrite(pinLed5, LOW);
  }
  else if (((TempC <= (tempMin + escala)) & (TempC > tempMin)))
  {
  digitalWrite(pinLed1, HIGH);
  digitalWrite(pinLed2, HIGH);
  digitalWrite(pinLed3, LOW);
  digitalWrite(pinLed4, LOW);
  digitalWrite(pinLed5, LOW);
  }
  else if (((TempC<=(tempMin+(escala*2)))&(TempC>tempMin+escala)))
  {
  digitalWrite(pinLed1, HIGH);
  digitalWrite(pinLed2, HIGH);
  digitalWrite(pinLed3, HIGH);
  digitalWrite(pinLed4, LOW);
  digitalWrite(pinLed5, LOW);
  }
  else if ((TempC<=(tempMin+(escala*3)))&(TempC>tempMin+(escala*2)))
  {
  digitalWrite(pinLed1, HIGH);
  digitalWrite(pinLed2, HIGH);
  digitalWrite(pinLed3, HIGH);
  digitalWrite(pinLed4, HIGH);
  digitalWrite(pinLed5, LOW);
  }
  else if (TempC > (tempMin + (escala*4)))
  {
  digitalWrite(pinLed1, HIGH);
  digitalWrite(pinLed2, HIGH);
  digitalWrite(pinLed3, HIGH);
  digitalWrite(pinLed4, HIGH);
  digitalWrite(pinLed5, HIGH);
  }
 
  //Un pequeño delay para no volver loco al puerto serie
  delay(500);
}
